// 链接 https://blog.csdn.net/qfc_128220/article/details/134454098
// 题目
// 题目描述
// 在一个大型体育场内举办了一场大型活动，由于疫情防控的需要，要求每位观众的必须间隔至少一个空位才允许落座。

// 现在给出一排观众座位分布图，座位中存在已落座的观众，请计算出，在不移动现有观众座位的情况下，最多还能坐下多少名观众。

// 输入描述
// 一个数组，用来标识某一排座位中，每个座位是否已经坐人。0表示该座位没有坐人，1表示该座位已经坐人。

// 1 ≤ 数组长度 ≤ 10000
// 输出描述
// 整数，在不移动现有观众座位的情况下，最多还能坐下多少名观众。

// 用例
// 输入	10001
// 输出	1
// 说明	无
// 输入	0101
// 输出	0
// 说明	无

const { findAllIndex, log } = require('../commonTool/zddtool.js');

function filerSeated(strSeat) {
    let indexArr = findAllIndex('1', strSeat);
    log(indexArr);

    let arrStr = strSeat.split('');
    for (let i = 0; i < indexArr.length; i++) {
        let strIndex = indexArr[i];
        if (strIndex > 0) {
            arrStr[strIndex - 1] = '1';
        }

        if (strIndex < strSeat.length - 1) {
            arrStr[strIndex + 1] = '1';
        }
    }

    return arrStr.reduce((acc, cur) => (acc += cur), '');
}

/**
 * 计算剩余位置能填充多少观众
 * @param {*} strSeat
 * @returns
 */
function filterZero(strSeat) {
    // 思路如下：
    // 逐个轮询字符串下标，如果下标为0，代表可以成为观众，
    // 但因为观众不能挨着，所以当连续出现0时，比如000，那就只能坐两（ ceil 3/2 ）个观众
    // collection是一个集合，用于记录出现0的位置，如果连续出现0，那只记录第一次出现0的地方
    // 比如字符串00010，那collection最后的结果为 {0:3,4:1}
    let collection = {};
    let previousIsZero = -1; // 前一个下标元素是否为0，-1不为0，为其他值时，代表上一个为0的位置
    for (let i = 0; i < strSeat.length; i++) {
        if (strSeat[i] === '0') {
            if (previousIsZero < 0) {
                if (!collection[i]) {
                    collection[i] = 1;
                } else {
                    collection[i] += 1;
                }
                previousIsZero = i;
            } else {
                collection[previousIsZero] += 1;
            }
        } else {
            previousIsZero = -1;
        }
    }

    let count = 0;
    for (key in collection) {
        count += Math.ceil(collection[key] / 2);
    }

    return count;
}

log(`要求每位观众的必须间隔至少一个空位才允许落座。`);

let testSeats = `10100000001000`;
log(testSeats);
let filterStr = filerSeated(testSeats);
log(`filerSeat: ${filterStr}`);
filterStr = filterZero(filterStr);
log(`filterZero: ${JSON.stringify(filterStr)}`);
